home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
doconv.s
< prev
next >
Wrap
Text File
|
2000-01-10
|
9KB
|
425 lines
.include doscall.mac
.include global.mac
;----------------------------------------------------------------
;PCMデータを前処理して.fmpファイルに出力する
.text
.align 4,$2048
do_conv::
movem.l d1-d7/a0-a6,-(sp)
bsr silent_print_banner
bsr malloc_buffer
bmi 99f
bsr make_table
bsr init_data
bmi 99f
tst.b silent_flag
bne @f
lea.l (m_conv_fmp_file1,pc),a0
bsr eprint
bsr 71f
lea.l (m_conv_fmp_file2,pc),a0
bsr eprintcrlf
@@:
moveq.l #1,d0 ;標準出力
move.l output_filename_ptr,d1 ;'-'のときは0,
;それ以外で'.'がないときは'.fmp'を追加済み
beq 1f
movea.l d1,a0
bsr wopen
bmi 80f ;書き込みオープンエラー
1: move.w d0,output_fileno ;ファイルハンドル
lea.l (m_conv_start_message,pc),a0
bsr silent_eprintcrlf
;第1ヘッダを作る
lea.l fmp_header1,a2
move.l a2,a0
move.l #'FMP ',(a0)+
lea.l (m_banner,pc),a1
bsr strcpy
move.b #13,(a0)+
move.b #10,(a0)+
tst.b param_env_work
beq @f
lea.l (str_set_space,pc),a1 ;'set '
bsr strcpy
lea.l (param_env_name,pc),a1
bsr strcpy
move.b #'=',(a0)+
lea.l param_env_work,a1
bsr strcpy
move.b #13,(a0)+
move.b #10,(a0)+
@@:
tst.b cdrom_env_work
beq @f
lea.l (str_set_space,pc),a1 ;'set '
bsr strcpy
lea.l (cdrom_env_name,pc),a1
bsr strcpy
move.b #'=',(a0)+
lea.l cdrom_env_work,a1
bsr strcpy
move.b #13,(a0)+
move.b #10,(a0)+
@@:
lea.l (program_head-256+$80,pc),a1 ;パス
bsr strcpy
lea.l (program_head-256+$C4,pc),a1 ;ファイル名
bsr strcpy
move.b #' ',(a0)+
movea.l (program_head-256+$20,pc),a1 ;コマンドライン
addq.l #1,a1
bsr strcpy
move.b #13,(a0)+
move.b #10,(a0)+
move.b #$1A,(a0)+
clr.b (a0)
suba.l a2,a0
move.l a0,fmp_header1_size ;第1ヘッダのサイズ
move.l a0,-(sp)
move.l a2,-(sp)
move.w output_fileno,-(sp)
DOS _WRITE
lea.l (10,sp),sp
tst.l d0
bmi 82f ;書き込みエラー
cmp.l a0,d0
bne 83f ;ディスクフル?
;第2ヘッダを作る
lea.l fmp_header2,a2
movea.l a2,a0
move.l #'S44P',(a0)+ ;'S44P'
move.l #FMP_VERSION,(a0)+ ;FMP_VERSION
move.l #4+4,(a0)+ ;ヘッダのサイズ(4+4=8)
tst.b mono_flag
beq 1f
move.l #1,(a0)+ ;モノラル
bra 2f
1: move.l #2,(a0)+ ;ステレオ
2:
move.b output_timerd_count,d0
bpl 1f
move.l a0,-(sp)
lea.l (default_timerd_count_table_000,pc),a0
tst.b current_machine_num
beq @f
lea.l (default_timerd_count_table_030,pc),a0
@@: moveq.l #0,d0
move.b current_mpu_num,d0
move.b (a0,d0.l),d0
movea.l (sp)+,a0
1: move.b d0,data_timerd_count
moveq.l #1,d1
tst.b mono_flag
bne @f
moveq.l #2,d1
@@: bsr timerd_count_to_frequency
move.l d0,(a0)+ ;サンプリング周波数
clr.l (a0)+ ;データ本体のサイズを記録する領域
suba.l a2,a0
move.l a0,fmp_header2_size ;第2ヘッダ+データ本体のサイズの領域のサイズ
move.l a0,-(sp)
move.l a2,-(sp)
move.w output_fileno,-(sp)
DOS _WRITE
lea.l (10,sp),sp
tst.l d0
bmi 82f ;書き込みエラー
cmp.l a0,d0
bne 83f ;ディスクフル?
lea.l param_buf,a2
tst.l (pb_ptr,a2)
bmi do_conv_done
;1番目のデータ
move.l a2,current_param_ptr
bsr open_data
bmi 60f ;エラー
beq 11f ;データなし正常終了
;.fmpファイルにモノラルとステレオを混在できないので,
;-mono指定がないときモノラルデータは不可とする
;ただし、データが1個しかないときは強制的にモノラルモードに切り替える
tst.b mono_flag
bne @f
tst.b mono_data_flag
beq @f
movea.l next_param_ptr,a0
tst.l (pb_ptr,a0)
bpl 84f ;次のデータがあるのでエラー
st.b mono_flag ;強制的に-mono指定にする
@@:
bra do_conv_loop_1
do_conv_loop:
move.l a2,current_param_ptr
bsr open_data
bmi 60f ;エラー
beq 11f ;データなし正常終了
;.fmpファイルにモノラルとステレオを混在できないので,
;-mono指定がないときモノラルデータは不可とする
tst.b mono_flag
bne @f
tst.b mono_data_flag
bne 84f
@@:
do_conv_loop_1:
;FMPフォーマットのデータはモノラル/ステレオを変換できない
tst.b fmp_data_flag
beq @f
tst.b mono_data_flag
beq 1f
tst.b mono_flag
beq 85f
bra 2f
1: tst.b mono_flag
bne 85f
2:
@@:
bsr init_preconv
tst.b silent_flag
bne @f
bsr get_restsize_data ;残りサイズ=データのサイズを得る
move.l d0,d7
@@:
clr.l fmp_data_size
movea.l buf0top,a3
movea.l buf1top,a4
movea.l buf2top,a5
movea.l buf3top,a6
10: DOS _KEYSNS
cmp.b #3,d0
beq 81f
movea.l a3,a0 ;出力バッファの先頭
movea.l a4,a1 ;入力バッファの先頭
bsr read_data
bmi 60f
beq 11f
move.l d0,d1 ;変換後のサイズ
tst.b silent_flag
bne @f
moveq.l #13,d0
bsr eputchar
bsr get_restsize_data ;残りサイズ=データのサイズを得る
sub.l d7,d0
neg.l d0
bsr utos_eprint
moveq.l #' ',d0
bsr eputchar
moveq.l #'/',d0
bsr eputchar
moveq.l #' ',d0
bsr eputchar
move.l d7,d0
bsr utos_eprint
@@:
tst.b (1,a3,d1.l) ;$00+$00/$01
bne @f
andi.b #$7F,(-1,a3,d1.l) ;エンドコードを除去する
@@:
move.l d1,-(sp)
move.l a3,-(sp) ;バッファの先頭
move.w output_fileno,-(sp)
DOS _WRITE
lea.l (10,sp),sp
tst.l d0
bmi 82f ;書き込みエラー
cmp.l d1,d0
bne 83f ;ディスクフル
add.l d1,fmp_data_size
exg.l a3,a5
exg.l a4,a6
bra 10b
11:
tst.b silent_flag
bne @f
moveq.l #13,d0
bsr eputchar
move.l d7,d0
bsr utos_eprint
moveq.l #' ',d0
bsr eputchar
moveq.l #'/',d0
bsr eputchar
moveq.l #' ',d0
bsr eputchar
move.l d7,d0
bsr utos_eprint
@@:
bsr close_data
movea.l next_param_ptr,a2
tst.l (pb_ptr,a2)
bpl do_conv_loop
do_conv_done:
move.l fmp_header1_size,d1
add.l fmp_header2_size,d1 ;ヘッダ+データ本体のサイズの領域のサイズ
subq.l #4,d1 ;ヘッダのデータ本体のサイズの領域のオフセット
clr.w -(sp)
move.l d1,-(sp)
move.w output_fileno,-(sp)
DOS _SEEK
addq.l #8,sp
move.l fmp_data_size,-(sp) ;ヘッダにデータ本体のサイズを書き込む
pea.l 4.w
pea.l (4,sp)
move.w output_fileno,-(sp)
DOS _WRITE
lea.l (10+4,sp),sp
addq.l #4,d1 ;データ本体の先頭のオフセット
add.l fmp_data_size,d1 ;データ本体の末尾のオフセット
clr.w -(sp) ;念のためポインタをファイルの末尾に進めておく
move.l d1,-(sp)
move.w output_fileno,-(sp)
DOS _SEEK
addq.l #8,sp
tst.b silent_flag
bne @f
bsr ecrlf
lea.l (m_fmp_data_size1,pc),a0
bsr eprint
move.l fmp_data_size,d0
bsr utos_eprint
lea.l (m_fmp_data_size2,pc),a0
bsr eprint
@@:
moveq.l #0,d0
60: bsr silent_ecrlf
61: move.l d0,d7
move.w output_fileno,d0
cmp.w #1,d0
ble 1f
move.w d0,-(sp)
DOS _CLOSE
addq.l #2,sp
move.w #-1,output_fileno
tst.l d7
beq 1f
move.l output_filename_ptr,d0
beq 1f
move.l d0,-(sp)
DOS _DELETE
addq.l #4,sp
1:
;バッファの開放はメインルーチンがやるので不要
move.l d7,d0
99: tst.l d0
movem.l (sp)+,d1-d7/a0-a6
rts
80: move.w #EXIT_CANNOT_WRITE_OPEN,exit_code
bsr 70f
lea.l (m_cannot_write_open,pc),a0
bra 89f
81: bsr ecrlf
lea.l (m_conv_abort,pc),a0
bra 88f
82: move.w #EXIT_FILE_WRITE_ERROR,exit_code
bsr 70f
lea.l (m_file_write_error,pc),a0
bra 89f
83: move.w #EXIT_DISK_FULL,exit_code
bsr 70f
lea.l (m_disk_full,pc),a0
bra 89f
84: move.w #EXIT_FMP_MONO_CONFLICT,exit_code
lea.l (m_mono_conflict,pc),a0
bra 88f
85: move.w #EXIT_FMP_CONFLICT,exit_code
lea.l (m_fmp_conflict,pc),a0
88: bsr eaonly
89: bsr eprintcrlf
moveq.l #-1,d0
bra 61b
70: bsr eaonly
71: lea.l (m_stdout_message,pc),a0
move.l output_filename_ptr,d0
beq eprint
lea.l (m_file_message1,pc),a0
bsr eprint
movea.l d0,a0
bsr eprint
lea.l (m_file_message2,pc),a0
bra eprint
str_set_space: .dc.b 'set ',0
m_conv_fmp_file1: .dc.b 'PCM → OPM 変換を行い、',0
m_conv_fmp_file2: .dc.b 'に出力します',0
m_stdout_message: .dc.b '標準出力'
;m_file_message1: .dc.b "ファイル `",0
;m_file_message2: .dc.b "' ",0
m_fmp_data_size1: .dc.b '出力データサイズ: ',0
m_fmp_data_size2: .dc.b ' バイト',0
m_cannot_write_open: .dc.b 'を作れません',0
m_conv_start_message: .dc.b '変換を開始します',0
m_conv_abort: .dc.b '変換を中止します',0
m_file_write_error: .dc.b 'に書き込めません',0
m_disk_full: .dc.b 'に書き込めません(ディスクフル)',0
m_mono_conflict: .dc.b 'モノラルのデータはステレオに変換できません',0
m_fmp_conflict: .dc.b 'FMP フォーマットのデータはモノラル/ステレオを変換できません',0
.even
.data
.even
output_fileno:: .dc.w -1
.bss
;第1ヘッダ
.even
fmp_header1: .ds.b FMP_CHECK_LENGTH
;第2ヘッダ
.align 4
fmp_header2: .ds.l 1 ;'S44P'
.ds.l 1 ;FMP_VERSION
.ds.l 1 ;ヘッダのサイズ(4+4=8)
;ヘッダ
.ds.l 1 ;チャンネル数(1=モノラル,2=ステレオ)
.ds.l 1 ;サンプリング周波数(44100)
.ds.l 1 ;データ本体のサイズを記録する領域
.align 4
fmp_header1_size: .ds.l 1 ;第1ヘッダのサイズ
fmp_header2_size: .ds.l 1 ;第2ヘッダ+データ本体のサイズの領域のサイズ
fmp_data_size: .ds.l 1 ;データ本体のサイズ